/*
 * @Description: 定义响应式
 * @Author: wangqi
 * @Date: 2021-05-23 09:56:06
 * @LastEditTime: 2021-06-06 12:16:51
 */
import observe from './observe';
import Dep from './Dep';

export default function defineReactive(data, key, val) {
    const dep = new Dep();

    if (!val) { val = data[key] }

    // 这里val如果是对象||数组仍然需要进行监测
    let childOb = observe(val);

    Object.defineProperty(data, key, {
        // 可枚举
        enumerable: true,
        // 可以被配置，比如可以被delete
        configurable: true,

        get() {
            if (Dep.target) {
                // 添加依赖
                dep.depend();
                if (childOb) {
                    childOb.dep.depend();
                }
            }
            return val;
        },

        set(newValue) {
            if (val === newValue) return;
            val = newValue;
            // 如果设置了新值也需要进行监测
            childOb = observe(newValue);
            // dep通知对象更新
            dep.notify();
        },

    });
}


